package com.the.ui.widge.photoview

import android.animation.Animator
import android.content.Context
import android.graphics.Canvas
import android.util.AttributeSet
import android.view.MotionEvent
import kotlin.math.max
import kotlin.math.min

//  ┏┓　　　┏┓
//┏┛┻━━━┛┻┓
//┃　　　　　　　┃
//┃　　　━　　　┃
//┃　┳┛　┗┳　┃
//┃　　　　　　　┃
//┃　　　┻　　　┃
//┃　　　　　　　┃
//┗━┓　　　┏━┛
//    ┃　　　┃                  神兽保佑
//    ┃　　　┃                  永无BUG！
//    ┃　　　┗━━━┓
//    ┃　　　　　　　┣┓
//    ┃　　　　　　　┏┛
//    ┗┓┓┏━┳┓┏┛
//      ┃┫┫　┃┫┫
//      ┗┻┛　┗┻┛
/**
 * @author The one
 * @date 2021-11-03 16:56
 * @describe 跟随点击位置放大时平移
 * @email 625805189@qq.com
 * @remark
 */
open class PhotoView4
@JvmOverloads constructor(
    context: Context,
    attrs: AttributeSet? = null,
    defStyleAttr: Int = 0,
    defStyleRes: Int = 0
) : PhotoView3(context, attrs, defStyleAttr, defStyleRes) {

    var offsetX:Float = 0.0F
    var offsetY:Float = 0.0F

    /**
     * 平移
     * @param canvas Canvas
     */
    override fun translate(canvas: Canvas) {
        val scaleFraction = (currentScale - smallScale)/(bigScale-smallScale)
        canvas.translate(offsetX*scaleFraction,offsetY*scaleFraction)
    }

    /**
     * 开始动画
     */
    override fun startAnimator() {
        getAnimator().run {
            removeAllListeners()
            start()
        }
    }

    /**
     * 回滚动画
     */
    override fun reverseAnimator() {
        getAnimator().run {
            reverse()
            addListener(object :Animator.AnimatorListener{

                override fun onAnimationStart(animation: Animator?) {
                }

                override fun onAnimationEnd(animation: Animator?) {
                    // 动画结束后清除偏移量
                    offsetX = 0.0F
                    offsetY = 0.0F
                }

                override fun onAnimationCancel(animation: Animator?) {
                }

                override fun onAnimationRepeat(animation: Animator?) {
                }

            })
        }
    }

    /**
     * 计算偏移量
     */
    override fun computeOffset(e: MotionEvent) {
        val x = e.x - width/2f
        val y = e.y - height/2f
        val scale = 1 - bigScale/smallScale
        offsetX = x * scale
        offsetY = y * scale
        fixOffsets()
    }

    /**
     * 处理边界
     */
    protected fun fixOffsets(){
        val fixX = (mBitmap.width*bigScale - width)/2f
        val fixY = (mBitmap.height*bigScale - height)/2f
        offsetX = min(offsetX,fixX)
        offsetX = max(offsetX,-fixX)
        offsetY = min(offsetY,fixY)
        offsetY = max(offsetY,-fixY)
    }

}